package com.fare.taluo.util.flightInfo;

import java.util.ArrayList;
import java.util.List;

import com.fare.taluo.core.domain.config.line.FlightInfoEntity;
import com.fare.taluo.em.TimePeriod;
import com.fare.taluo.fusionCharts.ChartDateUtil;

/**
 * 航班日期和时间范围的工具类
 * 主要用于生成航班起飞时间和时间范围的交集
 * @author Administrator
 *
 */
public class FlightInfoTimePersiodUtil {
	/**
	 * 根据航班的起飞日期和用户所选择的时间范围筛选出时间段(两者取交集)
	 * 
	 * 为了避免罗列24小时的情况
	 * @return
	 */
	public static  List<Integer> getHoursByFlightInfosAndTimePerisiod(List<FlightInfoEntity> flights,List<TimePeriod> timePeriods){
		List<Integer> tps=ChartDateUtil.getEveryHourInTimePersiod(timePeriods);//得到时间范围的时间
		return _getHours(flights,tps);
	}
	
	/**
	 * 指定开始和结束时间并且求出和航班起飞时间的交集
	 * @param flights
	 * @param start
	 * @param end
	 * @return
	 */
	public static  List<Integer> getHoursByFlightInfosAndTimePerisiod(List<FlightInfoEntity> flights,int start,int end){
		List<Integer> tps=ChartDateUtil.getHours(start, end);
		return _getHours(flights,tps);
	}
	
	
	private static List<Integer> _getHours(List<FlightInfoEntity> flights,List<Integer> timePersiods){
		List<Integer> tps=timePersiods;//得到时间范围的时间
		List<Integer> result=new ArrayList<Integer>();//最终返回的结果
		if(flights!=null && !flights.isEmpty()){
			for(FlightInfoEntity f:flights){
				//这里的策略是，如果航班是11：00起飞，那么我们认为他的起飞时间就是11，如果他是11：05起飞，我们认为就是他就是属于>11 而<12的起飞时间，
				//那么用户选择的时间范围必须到了12才能有这个11：05的航班出现。
				//但是我们返回的时候不能返回12，只能返回11，我们仅仅是起到了过滤的作用，如果用户没有12的，那我们就什么都不不返回
				if(f!=null && f.getFlightStartTime()!=null){
					String hourStr=f.getFlightStartTime().replaceAll(":.*", "").replaceAll("^0","");
					String minuteStr=f.getFlightStartTime().replaceAll("^\\d{2}:", "").replaceAll("^0", "");
					if(hourStr.matches("^\\d*+") && minuteStr.matches("^\\d+")){
						int hour=Integer.parseInt(hourStr);
						int minute=Integer.parseInt(minuteStr);
						int temp=hour;
						if(minute>0){
							temp++;
						}
						if(temp>23){
							temp=0;
						}
						if(tps.contains(hour) && tps.contains(temp) && !result.contains(hour)){//如果推算出来的起飞时间范围位于所选择的时间范围且结果集没有此小时
							result.add(hour);
						}
					}
				}
			}
		}
		return result;
	}
	
}
